home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / dev / e / e_modules02.lha / e_modules02 / unpack / unpacker.e < prev    next >
Encoding:
Text File  |  1996-07-31  |  5.4 KB  |  174 lines

  1. OPT OSVERSION=37
  2. OPT PREPROCESS,LARGE,REG=5
  3.  
  4. ->#define DEBUG
  5.  
  6. /*
  7. *-- AutoRev header do NOT edit!
  8. *
  9. *   Project         :   unpacker (based on unpack.library)
  10. *   File            :   unpacker.e
  11. *   Copyright       :   © 1996 Piotr Gapiïski
  12. *   Author          :   Piotr Gapiïski
  13. *   Creation Date   :   11.07.96
  14. *   Current version :   2.0
  15. *   Translator      :   AmigaE v3.2e
  16. *
  17. *   REVISION HISTORY
  18. *
  19. *   Date      Version  Comment
  20. *   --------  -------  ----------------------------------------------------
  21. *   05.01.96  1.0      pierwsza wersja, nie uwzglëdniono LHA,LZH,DMS
  22. *   25.04.96  1.1      poprawione tworzenie nazw plików rozpakowanych
  23. *   11.07.96  2.0      poprawione tworzenie nazw plików
  24. *
  25. *-- REV_END --*
  26. */
  27.  
  28. MODULE 'dos/dos',
  29.        'libraries/unpack','unpack','other/ecode'
  30. #ifdef DEBUG
  31. MODULE 'tools/debug'
  32. #endif
  33.  
  34. #define PROGRAMVERSION '$VER: unpacker v2.0 (11.07.96) (c)\a96 Piotr Gapiïski'
  35. #define TEMPLATE 'FILE/A,TO/A,QUIET/S'
  36.  
  37. #define MSG_CLI_BADARGS       'Bad args!\n'
  38. #define MSG_CLI_NOUNPACKERLIB 'Couldn\at open unpacker.library v39+ !\n'
  39. #define MSG_CLI_NOMEM         'No free memory!\n'
  40. #define MSG_CLI_NOUNPACK      'Error: \s !\n'
  41. #define MSG_CLI_NOARCHIVES    'Sorry, but archives are not supported...\n'
  42. #define MSG_CLI_WRONGPATH     'Wrong destination path!\n'
  43. #define MSG_CLI_NONEWFILE     'Couldn\at create file \s!\n'
  44. #define MSG_CLI_NOWRITE       'Error while writing to file \s!\n'
  45.  
  46. ENUM ARG_FROM,ARG_TO,ARG_QUIET,NUMARGS
  47.  
  48. PROC main() HANDLE
  49.   DEF rdargs=0,args[NUMARGS]:LIST,info=NIL:PTR TO unpackinfo
  50.  
  51.   IF (rdargs:=ReadArgs(TEMPLATE,
  52.       args:=[0,0,0],NIL))=NIL THEN Raise(MSG_CLI_BADARGS)
  53.   IF (unpackbase:=OpenLibrary(UNPACKNAME,39))=NIL THEN Raise(MSG_CLI_NOUNPACKERLIB)
  54.   IF (info:=UpAllocCInfo())=NIL THEN Raise(MSG_CLI_NOMEM)
  55.  
  56.   info.flag:=UFN_ONEFILE
  57.   info.path:=args[ARG_TO]
  58.   info.jump:=eCode({scan})
  59.   info.trackjump:=NIL
  60.   info.userdata:=info
  61.  
  62.   IF (UpDetermineFile(info,
  63.       args[ARG_FROM]))=NIL THEN Throw(MSG_CLI_NOUNPACK,info.errormsg)
  64.   IF args[ARG_QUIET]=FALSE THEN showinfo(info)
  65.  
  66.   IF (UpUnpack(info))=NIL THEN Throw(MSG_CLI_NOUNPACK,info.errormsg)
  67.   IF args[ARG_QUIET]=FALSE THEN WriteF('READY.\n')
  68. EXCEPT DO
  69.   IF exception THEN WriteF(exception,
  70.                     IF exceptioninfo THEN exceptioninfo ELSE NIL)
  71.   IF info THEN UpFreeCInfo(info)
  72.   IF rdargs THEN FreeArgs(rdargs)
  73.   IF unpackbase THEN CloseLibrary(unpackbase)
  74. ENDPROC
  75.  
  76.  
  77. PROC showinfo(info:PTR TO unpackinfo)
  78.   DEF crunchtype,typename
  79.  
  80.   crunchtype:=info.crunchtype
  81.   SELECT crunchtype
  82.   CASE CRU_ARCHIVE
  83.     typename:='Archive (Lha, Zoo Etc.)'
  84.   CASE CRU_DATA
  85.     typename:='Data File'
  86.   CASE CRU_OBJECT
  87.     typename:='Object File'
  88.   CASE CRU_OBJECT2
  89.     typename:='2 Segment Object File'
  90.   CASE CRU_TRACK
  91.     typename:='Track File (DMS)'
  92.   DEFAULT
  93.     typename:='UNKNOWN'
  94.   ENDSELECT
  95.   WriteF(' FILENAME: \s\nCOPIED TO: \s\n',info.filename,info.path)
  96.   WriteF(' FILETYPE: \s\n FILESIZE: \d (crunched)\n CRUNCHED: \s\n\n',
  97.          typename,info.crunchlen,info.crunchername)
  98. ENDPROC
  99.  
  100.  
  101. PROC scan() HANDLE
  102.   DEF part:PTR TO CHAR,path[256]:STRING,pathLock,
  103.       info=NIL:PTR TO unpackinfo,handle=NIL,size
  104.   DEF fib:fileinfoblock
  105.  
  106.   -> do tej procki przekazywany jest w A0 adres tej procedury,
  107.   -> w A1 adres danych zawartych w polu userdata struktury unpackinfo
  108.   MOVE.L A1,info
  109.   -> chwilowo nie obsîugujemy archiwów spakowanych DMSem i Lha,...
  110.   IF (info.crunchtype=CRU_ARCHIVE) OR
  111.      (info.crunchtype=CRU_TRACK) THEN Raise(MSG_CLI_NOARCHIVES)
  112.  
  113.   -> teraz naleûy okreôliê nazwë pliku docelowego (po rozpakowaniu)
  114.   -> najpierw sprawdzamy czy to co przekazano w linii poleceï z CLI
  115.   -> jest nazwâ katalogu docelowego czy moûe zawiera nawë pliku docelowego
  116.  
  117.   pathLock:=Lock(info.path,ACCESS_READ)
  118.   IF pathLock
  119.     -> istnieje - jest to katalog lub plik
  120.     Examine(pathLock,fib)
  121.     UnLock(pathLock)
  122.     IF fib.direntrytype>0
  123.       -> katalog,
  124.       -> kopiujemy do katalogu docelowego plik pod tâ samâ nazwâ co úródîowy
  125.       StrCopy(path,info.path)
  126.       part:=FilePart(IF info.usefilenamepointer<>0 THEN
  127.                      info.loadnamepoi ELSE info.filename)
  128.       AddPart(path,part,256)
  129.     ELSE
  130.       -> plik (juû istniejâcy)
  131.       -> zapisujemy nowy plik w miejscu starego (nadpisywanie)
  132.       StrCopy(path,info.path)
  133.     ENDIF
  134.   ELSE
  135.     -> nic o danej nazwie nie istnieje (ani katalog ani plik)
  136.     -> usuwamy ostatni fragment w ôcieûce dostëpu (zamiast WORK:C/X
  137.     -> bëdziemy mieli WORK:C
  138.     part:=PathPart(info.path)
  139.     StrCopy(path,info.path,StrLen(info.path)-StrLen(part))
  140.     -> sprawdzamy czy tak przerobiona ôcieûka dostëpu istenieje
  141.     -> tj. czy istnieje taki katalog (usuniëta czëôê byîa najprawdopodobniej
  142.     -> nazwâ nieistniejâcego pliku lub nazwâ nieistniejâcego katalogu)
  143.     pathLock:=Lock(path,ACCESS_READ)
  144.     IF pathLock
  145.       -> istnieje - zapisz plik rozkompresowany pod nazwâ okreôlonâ przez
  146.       -> uûytkownika
  147.       UnLock(pathLock)
  148.       StrCopy(path,info.path)
  149.     ELSE
  150.       -> jeûeli mimo wszystko nie istnieje nic takiego - wyôwietl komunikat
  151.      Raise(MSG_CLI_WRONGPATH)
  152.     ENDIF
  153.   ENDIF
  154.  
  155.   #ifdef DEBUG
  156.     kputfmt('PATH = \s\n',[path])
  157.   #endif
  158.  
  159.   handle:=Open(path,MODE_NEWFILE)
  160.   IF handle
  161.     size:=Write(handle,info.decrunchadr,info.decrunchlen)
  162.     Close(handle)
  163.     -> sprawdú czy byîy bîëdy przy zapisywaniu danych
  164.     IF size<>info.decrunchlen THEN Throw(MSG_CLI_NOWRITE,path)
  165.   ELSE
  166.     Throw(MSG_CLI_NONEWFILE,path)
  167.   ENDIF
  168.   RETURN 1
  169. EXCEPT
  170.   IF exception THEN WriteF(exception,exceptioninfo)
  171. ENDPROC NIL
  172.  
  173. CHAR PROGRAMVERSION,0
  174.